Concepts > OPC Data Client Concepts > OPC Data Client Extensions > OPC Data Client Integrated Extensions > OPC UA Complex Data Extension > Basic OPC UA Complex Data operations > OPC UA Complex Data reading |
To read complex data information, call one of the Read methods on the EasyUAClient Class as usual. When complex data is returned by the client, you will receive a value that is of type UAGenericObject Class, and you will process its contents. The actual generic data is in its GenericData Property.
How precisely you process the received generic data depends on the application. In general, there can be two usage cases:
The example below shows how to read and display OPC UA complex data.
// Shows how to read complex data with OPC UA Complex Data plug-in. // // Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html . // OPC client and subscriber examples in C# on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-CSharp . // Missing some example? Ask us for it on our Online Forums, https://www.opclabs.com/forum/index ! You do not have to own // a commercial license in order to use Online Forums, and we reply to every post. using System; using OpcLabs.BaseLib.DataTypeModel; using OpcLabs.EasyOpc.UA; using OpcLabs.EasyOpc.UA.ComplexData; using OpcLabs.EasyOpc.UA.OperationModel; namespace UADocExamples.ComplexData._EasyUAClient { class ReadValue { public static void Main1() { // Define which server and node we will work with. UAEndpointDescriptor endpointDescriptor = "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer"; // or "http://opcua.demo-this.com:51211/UA/SampleServer" (currently not supported) // or "https://opcua.demo-this.com:51212/UA/SampleServer/" UANodeDescriptor nodeDescriptor = "nsu=http://test.org/UA/Data/ ;i=10239"; // [ObjectsFolder]/Data.Static.Scalar.StructureValue // Instantiate the client object. var client = new EasyUAClient(); // Read a node which returns complex data. This is done in the same way as regular reads - just the data // returned is different. object value; try { value = client.ReadValue(endpointDescriptor, nodeDescriptor); } catch (UAException uaException) { Console.WriteLine("*** Failure: {0}", uaException.GetBaseException().Message); return; } // Display basic information about what we have read. Console.WriteLine(value); // We know that this node returns complex data, so we can type cast to UAGenericObject. var genericObject = (UAGenericObject) value; // The actual data is in the GenericData property of the UAGenericObject. // // If we want to see the whole hierarchy of the received complex data, we can format it with the "V" (verbose) // specifier. In the debugger, you can view the same by displaying the private DebugView property. Console.WriteLine(); Console.WriteLine("{0:V}", genericObject.GenericData); // For processing the internals of the data, refer to examples for GenericData and DataType classes. // .Int32Value var int32Value = ((genericObject.GenericData as StructuredData) ?.FieldData["Int32Value"] as PrimitiveData) ?.Value as int?; Console.WriteLine(); Console.WriteLine($"Int32Value: {int32Value}"); // Example output (truncated): // //(ScalarValueDataType) structured // //(ScalarValueDataType) structured // [BooleanValue] (Boolean) primitive; True {System.Boolean} // [ByteStringValue] (ByteString) primitive; System.Byte[] {System.Byte[]} // [ByteValue] (Byte) primitive; 153 {System.Byte} // [DateTimeValue] (DateTime) primitive; 5/11/2013 4:32:00 PM {System.DateTime} // [DoubleValue] (Double) primitive; -8.93178007363702E+27 {System.Double} // [EnumerationValue] (Int32) primitive; 0 {System.Int32} // [ExpandedNodeIdValue] (ExpandedNodeId) structured // [NamespaceURI] (CharArray) primitive; "http://samples.org/UA/memorybuffer/Instance" {System.String} // [NamespaceURISpecified] (Bit) primitive; True {System.Boolean} // [NodeIdType] (NodeIdType) enumeration; 3 (String) // [ServerIndexSpecified] (Bit) primitive; False {System.Boolean} // [String] (StringNodeId) structured // [Identifier] (CharArray) primitive; "????" {System.String} // [NamespaceIndex] (UInt16) primitive; 0 {System.UInt16} // [FloatValue] (Float) primitive; 78.37176 {System.Single} // [GuidValue] (Guid) primitive; 8129cdaf-24d9-8140-64f2-3a6d7a957fd7 {System.Guid} // [Int16Value] (Int16) primitive; 2793 {System.Int16} // [Int32Value] (Int32) primitive; 1133391074 {System.Int32} // [Int64Value] (Int64) primitive; -1039109760798965779 {System.Int64} // [Integer] (Variant) structured // [ArrayDimensionsSpecified] sequence[1] // [0] (Bit) primitive; False {System.Boolean} // [ArrayLengthSpecified] sequence[1] // [0] (Bit) primitive; False {System.Boolean} // [Int64] sequence[1] // [0] (Int64) primitive; 0 {System.Int64} // [VariantType] sequence[6] // [0] (Bit) primitive; False {System.Boolean} // [1] (Bit) primitive; False {System.Boolean} // [2] (Bit) primitive; False {System.Boolean} // [3] (Bit) primitive; True {System.Boolean} // [4] (Bit) primitive; False {System.Boolean} // [5] (Bit) primitive; False {System.Boolean} // [LocalizedTextValue] (LocalizedText) structured // [Locale] (CharArray) primitive; "ko" {System.String} // [LocaleSpecified] (Bit) primitive; True {System.Boolean} // [Reserved1] sequence[6] // [0] (Bit) primitive; False {System.Boolean} // [1] (Bit) primitive; False {System.Boolean} // [2] (Bit) primitive; False {System.Boolean} // [3] (Bit) primitive; False {System.Boolean} // [4] (Bit) primitive; False {System.Boolean} // [5] (Bit) primitive; False {System.Boolean} // [Text] (CharArray) primitive; "? ?? ??+ ??? ??) ?: ???? ?! ?!" {System.String} // [TextSpecified] (Bit) primitive; True {System.Boolean} // [NodeIdValue] (NodeId) structured } } }
' Shows how to read complex data with OPC UA Complex Data plug-in. ' ' Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html . ' OPC client and subscriber examples in VB.NET on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-VBNET . ' Missing some example? Ask us for it on our Online Forums, https://www.opclabs.com/forum/index ! You do not have to own ' a commercial license in order to use Online Forums, and we reply to every post. Imports OpcLabs.EasyOpc.UA Imports OpcLabs.EasyOpc.UA.ComplexData Imports OpcLabs.EasyOpc.UA.OperationModel Namespace ComplexData._EasyUAClient Friend Class ReadValue Public Shared Sub Main1() ' Define which server we will work with. Dim endpointDescriptor As UAEndpointDescriptor = "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer" ' or "http://opcua.demo-this.com:51211/UA/SampleServer" (currently not supported) ' or "https://opcua.demo-this.com:51212/UA/SampleServer/" ' Define which node we will work with. Dim nodeDescriptor As UANodeDescriptor = _ "nsu=http://test.org/UA/Data/ ;i=10239" ' [ObjectsFolder]/Data.Static.Scalar.StructureValue ' Instantiate the client object. Dim client = New EasyUAClient ' Read a node which returns complex data. This is done in the same way as regular reads - just the data ' returned is different. Dim value As Object Try value = client.ReadValue(endpointDescriptor, nodeDescriptor) Catch uaException As UAException Console.WriteLine("*** Failure: {0}", uaException.GetBaseException.Message) Exit Sub End Try ' Display basic information about what we have read. Console.WriteLine(value) ' We know that this node returns complex data, so we can type cast to UAGenericObject. Dim genericObject = CType(value, UAGenericObject) ' The actual data is in the GenericData property of the UAGenericObject. ' ' If we want to see the whole hierarchy of the received complex data, we can format it with the "V" (verbose) ' specifier. In the debugger, you can view the same by displaying the private DebugView property. Console.WriteLine() Console.WriteLine("{0:V}", genericObject.GenericData) ' For processing the internals of the data, refer to examples for GenericData and DataType classes. ' Example output (truncated): ' '(ScalarValueDataType) structured ' '(ScalarValueDataType) structured ' [BooleanValue] (Boolean) primitive; True {System.Boolean} ' [ByteStringValue] (ByteString) primitive; System.Byte[] {System.Byte[]} ' [ByteValue] (Byte) primitive; 153 {System.Byte} ' [DateTimeValue] (DateTime) primitive; 5/11/2013 4:32:00 PM {System.DateTime} ' [DoubleValue] (Double) primitive; -8.93178007363702E+27 {System.Double} ' [EnumerationValue] (Int32) primitive; 0 {System.Int32} ' [ExpandedNodeIdValue] (ExpandedNodeId) structured ' [NamespaceURI] (CharArray) primitive; "http://samples.org/UA/memorybuffer/Instance" {System.String} ' [NamespaceURISpecified] (Bit) primitive; True {System.Boolean} ' [NodeIdType] (NodeIdType) enumeration; 3 (String) ' [ServerIndexSpecified] (Bit) primitive; False {System.Boolean} ' [String] (StringNodeId) structured ' [Identifier] (CharArray) primitive; "????" {System.String} ' [NamespaceIndex] (UInt16) primitive; 0 {System.UInt16} ' [FloatValue] (Float) primitive; 78.37176 {System.Single} ' [GuidValue] (Guid) primitive; 8129cdaf-24d9-8140-64f2-3a6d7a957fd7 {System.Guid} ' [Int16Value] (Int16) primitive; 2793 {System.Int16} ' [Int32Value] (Int32) primitive; 1133391074 {System.Int32} ' [Int64Value] (Int64) primitive; -1039109760798965779 {System.Int64} ' [Integer] (Variant) structured ' [ArrayDimensionsSpecified] sequence[1] ' [0] (Bit) primitive; False {System.Boolean} ' [ArrayLengthSpecified] sequence[1] ' [0] (Bit) primitive; False {System.Boolean} ' [Int64] sequence[1] ' [0] (Int64) primitive; 0 {System.Int64} ' [VariantType] sequence[6] ' [0] (Bit) primitive; False {System.Boolean} ' [1] (Bit) primitive; False {System.Boolean} ' [2] (Bit) primitive; False {System.Boolean} ' [3] (Bit) primitive; True {System.Boolean} ' [4] (Bit) primitive; False {System.Boolean} ' [5] (Bit) primitive; False {System.Boolean} ' [LocalizedTextValue] (LocalizedText) structured ' [Locale] (CharArray) primitive; "ko" {System.String} ' [LocaleSpecified] (Bit) primitive; True {System.Boolean} ' [Reserved1] sequence[6] ' [0] (Bit) primitive; False {System.Boolean} ' [1] (Bit) primitive; False {System.Boolean} ' [2] (Bit) primitive; False {System.Boolean} ' [3] (Bit) primitive; False {System.Boolean} ' [4] (Bit) primitive; False {System.Boolean} ' [5] (Bit) primitive; False {System.Boolean} ' [Text] (CharArray) primitive; "? ?? ??+ ??? ??) ?: ???? ?! ?!" {System.String} ' [TextSpecified] (Bit) primitive; True {System.Boolean} ' [NodeIdValue] (NodeId) structured End Sub End Class End Namespace
// Shows how to read complex data with OPC UA Complex Data plug-in. // // Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html . // OPC client and subscriber examples in Object Pascal (Delphi) on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-OP . // Missing some example? Ask us for it on our Online Forums, https://www.opclabs.com/forum/index ! You do not have to own // a commercial license in order to use Online Forums, and we reply to every post. class procedure ReadValue.Main; var Client: _EasyUAClient; EndpointDescriptor: string; GenericObject: _UAGenericObject; NodeDescriptor: string; Value: OleVariant; begin // Define which server and node we will work with. EndpointDescriptor := //'http://opcua.demo-this.com:51211/UA/SampleServer'; //'https://opcua.demo-this.com:51212/UA/SampleServer/'; 'opc.tcp://opcua.demo-this.com:51210/UA/SampleServer'; NodeDescriptor := 'nsu=http://test.org/UA/Data/ ;i=10239'; // [ObjectsFolder]/Data.Static.Scalar.StructureValue // Instantiate the client object Client := CoEasyUAClient.Create; // Read a node which returns complex data. This is done in the same way as regular reads - just the data // returned is different. try Value := Client.ReadValue(EndpointDescriptor, NodeDescriptor); except on E: EOleException do begin WriteLn(Format('*** Failure: %s', [E.GetBaseException.Message])); Exit; end; end; // Display basic information about what we have read. WriteLn('value: ', Value); // We know that this node returns complex data, so it is a UAGenericObject. GenericObject := IUnknown(Value) as _UAGenericObject; // The actual data is in the GenericData property of the UAGenericObject. // // If we want to see the whole hierarchy of the received complex data, we can format it with the "V" (verbose) // specifier. In the debugger, you can view the same by displaying the private DebugView property. WriteLn; WriteLn(GenericObject.GenericData.ToString_2['V', nil]); // For processing the internals of the data, refer to examples for GenericData and DataType classes. // Example output (truncated): // //(ScalarValueDataType) structured // //(ScalarValueDataType) structured // [BooleanValue] (Boolean) primitive; True {System.Boolean} // [ByteStringValue] (ByteString) primitive; System.Byte[] {System.Byte[]} // [ByteValue] (Byte) primitive; 153 {System.Byte} // [DateTimeValue] (DateTime) primitive; 5/11/2013 4:32:00 PM {System.DateTime} // [DoubleValue] (Double) primitive; -8.93178007363702E+27 {System.Double} // [EnumerationValue] (Int32) primitive; 0 {System.Int32} // [ExpandedNodeIdValue] (ExpandedNodeId) structured // [NamespaceURI] (CharArray) primitive; "http://samples.org/UA/memorybuffer/Instance" {System.String} // [NamespaceURISpecified] (Bit) primitive; True {System.Boolean} // [NodeIdType] (NodeIdType) enumeration; 3 (String) // [ServerIndexSpecified] (Bit) primitive; False {System.Boolean} // [String] (StringNodeId) structured // [Identifier] (CharArray) primitive; "????" {System.String} // [NamespaceIndex] (UInt16) primitive; 0 {System.UInt16} // [FloatValue] (Float) primitive; 78.37176 {System.Single} // [GuidValue] (Guid) primitive; 8129cdaf-24d9-8140-64f2-3a6d7a957fd7 {System.Guid} // [Int16Value] (Int16) primitive; 2793 {System.Int16} // [Int32Value] (Int32) primitive; 1133391074 {System.Int32} // [Int64Value] (Int64) primitive; -1039109760798965779 {System.Int64} // [Integer] (Variant) structured // [ArrayDimensionsSpecified] sequence[1] // [0] (Bit) primitive; False {System.Boolean} // [ArrayLengthSpecified] sequence[1] // [0] (Bit) primitive; False {System.Boolean} // [Int64] sequence[1] // [0] (Int64) primitive; 0 {System.Int64} // [VariantType] sequence[6] // [0] (Bit) primitive; False {System.Boolean} // [1] (Bit) primitive; False {System.Boolean} // [2] (Bit) primitive; False {System.Boolean} // [3] (Bit) primitive; True {System.Boolean} // [4] (Bit) primitive; False {System.Boolean} // [5] (Bit) primitive; False {System.Boolean} // [LocalizedTextValue] (LocalizedText) structured // [Locale] (CharArray) primitive; "ko" {System.String} // [LocaleSpecified] (Bit) primitive; True {System.Boolean} // [Reserved1] sequence[6] // [0] (Bit) primitive; False {System.Boolean} // [1] (Bit) primitive; False {System.Boolean} // [2] (Bit) primitive; False {System.Boolean} // [3] (Bit) primitive; False {System.Boolean} // [4] (Bit) primitive; False {System.Boolean} // [5] (Bit) primitive; False {System.Boolean} // [Text] (CharArray) primitive; "? ?? ??+ ??? ??) ?: ???? ?! ?!" {System.String} // [TextSpecified] (Bit) primitive; True {System.Boolean} // [NodeIdValue] (NodeId) structured end;
// Shows how to read complex data with OPC UA Complex Data plug-in. // // Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html . // OPC client and subscriber examples in PHP on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-PHP . // Missing some example? Ask us for it on our Online Forums, https://www.opclabs.com/forum/index ! You do not have to own // a commercial license in order to use Online Forums, and we reply to every post. // Define which server and node we will work with. $EndpointDescriptor = //"http://opcua.demo-this.com:51211/UA/SampleServer"; //"https://opcua.demo-this.com:51212/UA/SampleServer/"; "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer"; $NodeDescriptor = "nsu=http://test.org/UA/Data/ ;i=10239"; // [ObjectsFolder]/Data.Static.Scalar.StructureValue // Instantiate the client object $Client = new COM("OpcLabs.EasyOpc.UA.EasyUAClient"); // Read a node which returns complex data. This is done in the same way as regular reads - just the data // returned is different. try { $Value = $Client->ReadValue($EndpointDescriptor, $NodeDescriptor); } catch (com_exception $e) { printf("*** Failure: %s\n", $e->getMessage()); Exit(); } // Display basic information about what we have read. printf("Value: %s\n", $Value); // We know that this node returns complex data, so it is a UAGenericObject. $GenericObject = $Value; // The actual data is in the GenericData property of the UAGenericObject. // // If we want to see the whole hierarchy of the received complex data, we can format it with the "V" (verbose) // specifier. In the debugger, you can view the same by displaying the private DebugView property. printf("\n"); printf("%s\n", $GenericObject->GenericData->ToString_3("V")); // For processing the internals of the data, refer to examples for GenericData and DataType classes. // Example output (truncated): // //(ScalarValueDataType) structured // //(ScalarValueDataType) structured // [BooleanValue] (Boolean) primitive; True {System.Boolean} // [ByteStringValue] (ByteString) primitive; System.Byte[] {System.Byte[]} // [ByteValue] (Byte) primitive; 153 {System.Byte} // [DateTimeValue] (DateTime) primitive; 5/11/2013 4:32:00 PM {System.DateTime} // [DoubleValue] (Double) primitive; -8.93178007363702E+27 {System.Double} // [EnumerationValue] (Int32) primitive; 0 {System.Int32} // [ExpandedNodeIdValue] (ExpandedNodeId) structured // [NamespaceURI] (CharArray) primitive; "http://samples.org/UA/memorybuffer/Instance" {System.String} // [NamespaceURISpecified] (Bit) primitive; True {System.Boolean} // [NodeIdType] (NodeIdType) enumeration; 3 (String) // [ServerIndexSpecified] (Bit) primitive; False {System.Boolean} // [String] (StringNodeId) structured // [Identifier] (CharArray) primitive; "????" {System.String} // [NamespaceIndex] (UInt16) primitive; 0 {System.UInt16} // [FloatValue] (Float) primitive; 78.37176 {System.Single} // [GuidValue] (Guid) primitive; 8129cdaf-24d9-8140-64f2-3a6d7a957fd7 {System.Guid} // [Int16Value] (Int16) primitive; 2793 {System.Int16} // [Int32Value] (Int32) primitive; 1133391074 {System.Int32} // [Int64Value] (Int64) primitive; -1039109760798965779 {System.Int64} // [Integer] (Variant) structured // [ArrayDimensionsSpecified] sequence[1] // [0] (Bit) primitive; False {System.Boolean} // [ArrayLengthSpecified] sequence[1] // [0] (Bit) primitive; False {System.Boolean} // [Int64] sequence[1] // [0] (Int64) primitive; 0 {System.Int64} // [VariantType] sequence[6] // [0] (Bit) primitive; False {System.Boolean} // [1] (Bit) primitive; False {System.Boolean} // [2] (Bit) primitive; False {System.Boolean} // [3] (Bit) primitive; True {System.Boolean} // [4] (Bit) primitive; False {System.Boolean} // [5] (Bit) primitive; False {System.Boolean} // [LocalizedTextValue] (LocalizedText) structured // [Locale] (CharArray) primitive; "ko" {System.String} // [LocaleSpecified] (Bit) primitive; True {System.Boolean} // [Reserved1] sequence[6] // [0] (Bit) primitive; False {System.Boolean} // [1] (Bit) primitive; False {System.Boolean} // [2] (Bit) primitive; False {System.Boolean} // [3] (Bit) primitive; False {System.Boolean} // [4] (Bit) primitive; False {System.Boolean} // [5] (Bit) primitive; False {System.Boolean} // [Text] (CharArray) primitive; "? ?? ??+ ??? ??) ?: ???? ?! ?!" {System.String} // [TextSpecified] (Bit) primitive; True {System.Boolean} // [NodeIdValue] (NodeId) structured
Rem This example shows how to read and display data of an attribute (value, timestamps, and status code). Rem Rem Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html . Rem OPC client and subscriber examples in VBScript on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-VBScript . Rem Missing some example? Ask us for it on our Online Forums, https://www.opclabs.com/forum/index ! You do not have to own Rem a commercial license in order to use Online Forums, and we reply to every post. Option Explicit ' Define which server and node we will work with. Dim endpointDescriptor: endpointDescriptor = _ "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer" '"http://opcua.demo-this.com:51211/UA/SampleServer" '"https://opcua.demo-this.com:51212/UA/SampleServer/" Dim nodeDescriptor: nodeDescriptor = _ "nsu=http://test.org/UA/Data/ ;i=10239" ' [ObjectsFolder]/Data.Static.Scalar.StructureValue ' Instantiate the client object. Dim Client: Set Client = CreateObject("OpcLabs.EasyOpc.UA.EasyUAClient") ' Read a node which returns complex data. This is done in the same way as regular reads - just the data ' returned is different. On Error Resume Next Dim Value: Set Value = Client.ReadValue(endpointDescriptor, nodeDescriptor) If Err.Number <> 0 Then WScript.Echo "*** Failure: " & Err.Source & ": " & Err.Description WScript.Quit End If On Error Goto 0 ' Display basic information about what we have read. WScript.Echo Value ' We know that this node returns complex data, so it is a UAGenericObject. Dim GenericObject: Set GenericObject = Value ' The actual data is in the GenericData property of the UAGenericObject. ' ' If we want to see the whole hierarchy of the received complex data, we can format it with the "V" (verbose) ' specifier. In the debugger, you can view the same by displaying the private DebugView property. WScript.Echo WScript.Echo GenericObject.GenericData.ToString_2("V", Nothing) ' For processing the internals of the data, refer to examples for GenericData and DataType classes. ' Example output (truncated): ' '(ScalarValueDataType) structured ' '(ScalarValueDataType) structured ' [BooleanValue] (Boolean) primitive; True {System.Boolean} ' [ByteStringValue] (ByteString) primitive; System.Byte[] {System.Byte[]} ' [ByteValue] (Byte) primitive; 153 {System.Byte} ' [DateTimeValue] (DateTime) primitive; 5/11/2013 4:32:00 PM {System.DateTime} ' [DoubleValue] (Double) primitive; -8.93178007363702E+27 {System.Double} ' [EnumerationValue] (Int32) primitive; 0 {System.Int32} ' [ExpandedNodeIdValue] (ExpandedNodeId) structured ' [NamespaceURI] (CharArray) primitive; "http://samples.org/UA/memorybuffer/Instance" {System.String} ' [NamespaceURISpecified] (Bit) primitive; True {System.Boolean} ' [NodeIdType] (NodeIdType) enumeration; 3 (String) ' [ServerIndexSpecified] (Bit) primitive; False {System.Boolean} ' [String] (StringNodeId) structured ' [Identifier] (CharArray) primitive; "????" {System.String} ' [NamespaceIndex] (UInt16) primitive; 0 {System.UInt16} ' [FloatValue] (Float) primitive; 78.37176 {System.Single} ' [GuidValue] (Guid) primitive; 8129cdaf-24d9-8140-64f2-3a6d7a957fd7 {System.Guid} ' [Int16Value] (Int16) primitive; 2793 {System.Int16} ' [Int32Value] (Int32) primitive; 1133391074 {System.Int32} ' [Int64Value] (Int64) primitive; -1039109760798965779 {System.Int64} ' [Integer] (Variant) structured ' [ArrayDimensionsSpecified] sequence[1] ' [0] (Bit) primitive; False {System.Boolean} ' [ArrayLengthSpecified] sequence[1] ' [0] (Bit) primitive; False {System.Boolean} ' [Int64] sequence[1] ' [0] (Int64) primitive; 0 {System.Int64} ' [VariantType] sequence[6] ' [0] (Bit) primitive; False {System.Boolean} ' [1] (Bit) primitive; False {System.Boolean} ' [2] (Bit) primitive; False {System.Boolean} ' [3] (Bit) primitive; True {System.Boolean} ' [4] (Bit) primitive; False {System.Boolean} ' [5] (Bit) primitive; False {System.Boolean} ' [LocalizedTextValue] (LocalizedText) structured ' [Locale] (CharArray) primitive; "ko" {System.String} ' [LocaleSpecified] (Bit) primitive; True {System.Boolean} ' [Reserved1] sequence[6] ' [0] (Bit) primitive; False {System.Boolean} ' [1] (Bit) primitive; False {System.Boolean} ' [2] (Bit) primitive; False {System.Boolean} ' [3] (Bit) primitive; False {System.Boolean} ' [4] (Bit) primitive; False {System.Boolean} ' [5] (Bit) primitive; False {System.Boolean} ' [Text] (CharArray) primitive; "? ?? ??+ ??? ??) ?: ???? ?! ?!" {System.String} ' [TextSpecified] (Bit) primitive; True {System.Boolean} ' [NodeIdValue] (NodeId) structured
# Shows how to read complex data with OPC UA Complex Data plug-in. # # Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html . # OPC client and subscriber examples in Python on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-Python . # Missing some example? Ask us for it on our Online Forums, https://www.opclabs.com/forum/index ! You do not have to own # a commercial license in order to use Online Forums, and we reply to every post. # The QuickOPC package is needed. Install it using "pip install opclabs_quickopc". import opclabs_quickopc # Import .NET namespaces. from System import * from OpcLabs.BaseLib.DataTypeModel import * from OpcLabs.EasyOpc.UA import * from OpcLabs.EasyOpc.UA.OperationModel import * endpointDescriptor = UAEndpointDescriptor('opc.tcp://opcua.demo-this.com:51210/UA/SampleServer') # or 'http://opcua.demo-this.com:51211/UA/SampleServer' (currently not supported) # or 'https://opcua.demo-this.com:51212/UA/SampleServer/' # [ObjectsFolder]/Data.Static.Scalar.StructureValue nodeDescriptor = UANodeDescriptor('nsu=http://test.org/UA/Data/ ;i=10239') # Instantiate the client object. client = EasyUAClient() # Read a node which returns complex data. This is done in the same way as regular reads - just the data # returned is different. try: value = IEasyUAClientExtension.ReadValue(client, endpointDescriptor, nodeDescriptor) except UAException as uaException: print('*** Failure: ' + uaException.GetBaseException().Message) exit() # Display basic information about what we have read. print(value) # We know that this node returns complex data, so we can type cast to UAGenericObject. genericObject = value # The actual data is in the GenericData property of the UAGenericObject. # # If we want to see the whole hierarchy of the received complex data, we can format it with the "V" (verbose) # specifier. In the debugger, you can view the same by displaying the private DebugView property. print() print(String.Format('{0:V}', genericObject.GenericData)) # For processing the internals of the data, refer to examples for GenericData and DataType classes. # .Int32Value structuredData = genericObject.GenericData if isinstance(genericObject.GenericData, StructuredData) else None fieldData = None if structuredData is None else structuredData.FieldData fieldValue = None if fieldData is None else fieldData.get_Item('Int32Value') primitiveData = fieldValue if isinstance(fieldValue, PrimitiveData) else None int32Value = None if primitiveData is None else primitiveData.Value print() print('Int32Value: ', int32Value, sep='') print() print('Finished.')
Copyright © 2004-2024 CODE Consulting and Development, s.r.o., Plzen. All rights reserved.
Documentation Home, Send Documentation Feedback. Technical Support